﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Transactions;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.Unity;
using Microsoft.Practices.Unity;
using Vallejos.Criptografia;
using Vallejos.Datos.Factory;
using Vallejos.Datos.Servicios;
using Vallejos.Entidades.Interfaces;
using Vallejos.Entidades.ModeloDeDatos;
using Vallejos.Excepciones;

namespace Vallejos.Datos.Accesos
{
    public class ConcesionariaDAL : IConcesionaria
    {
        private readonly DatabaseService _database;
        private readonly ComunDAL _comun;

        public ConcesionariaDAL()
        {
            var container = new UnityContainer()
                .AddNewExtension<EnterpriseLibraryCoreExtension>();
            _database = container.Resolve<DatabaseService>();

            _comun = new ComunDAL();
        }

        public List<Concesionaria> LeerConcesionarias()
        {
            var concesionarias = new List<Concesionaria>();

            var factory = new ConcesionariaFactory();

            try
            {
                using (var command = _database.GetStoredProcCommand("LeerConcesionarias"))
                {
                    using (var reader = _database.ExecuteReader(command))
                        while (reader.Read())
                        {
                            var concesionaria = factory.Crear(reader);
                            concesionaria.DatosDeEmpresa = _comun.LeerInformacionDeEmpresa(concesionaria.DatosDeEmpresa.Id);
                            concesionarias.Add(concesionaria);
                        }
                }
            }
            catch (Exception ex)
            {
                throw new ExcepcionDatos("Error desconocido", ex);
            }

            return concesionarias;
        }

        public List<Concesionaria> BuscarConcesionarias(Concesionaria concesionaria)
        {
            var concesionarias = new List<Concesionaria>();

            var factory = new ConcesionariaFactory();

            try
            {
                using (var command = _database.GetStoredProcCommand("BuscarConcesionarias")) 
                {
                    _database.AddInParameter(command, "CUIT", DbType.String, concesionaria.CUITNombre);
                    _database.AddInParameter(command, "RazonSocial", DbType.String, concesionaria.RazonSocialNombre);

                    using (var reader = _database.ExecuteReader(command))
                        while (reader.Read())
                        {
                            var concesionariaEncontrada = factory.Crear(reader);
                            concesionariaEncontrada.DatosDeEmpresa = _comun.LeerInformacionDeEmpresa(concesionariaEncontrada.DatosDeEmpresa.Id);
                            concesionarias.Add(concesionariaEncontrada);
                        }
                }
            }
            catch (Exception ex)
            {
                throw new ExcepcionDatos("Error desconocido", ex);
            }

            return concesionarias;
        }

        public Concesionaria GuardarConcesionaria(Concesionaria concesionaria)
        {
            try
            {
                using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
                {
                    using (var command = _database.GetStoredProcCommand("GuardarConcesionaria"))
                    {
                        concesionaria.DatosDeEmpresa = _comun.GuardarInformacionDeEmpresa(concesionaria.DatosDeEmpresa);

                        if (concesionaria.Id != 0)
                            _database.AddInParameter(command, "Id", DbType.Int32, concesionaria.Id);
                        else
                            _database.AddOutParameter(command, "Id", DbType.Int32, Int32.MaxValue);

                        _database.AddInParameter(command, "Id_DatosDeEmpresa", DbType.Int32, concesionaria.DatosDeEmpresa.Id);

                        _database.ExecuteNonQuery(command);

                        if (concesionaria.Id == 0)
                            concesionaria.Id = Convert.ToInt32(_database.GetParameterValue(command, "Id"));

                        scope.Complete();
                    }
                }

                return concesionaria;
            }
            catch (Exception ex)
            {
                throw new ExcepcionDatos("Error desconocido", ex);
            }
        }

        public Concesionaria LeerConcesionaria(int idConcesionaria)
        {
            var concesionaria = new Concesionaria();

            var factory = new ConcesionariaFactory();

            try
            {
                using (var command = _database.GetStoredProcCommand("LeerConcesionaria"))
                {

                    _database.AddInParameter(command, "Id", DbType.Int32, idConcesionaria);

                    using (var reader = _database.ExecuteReader(command))
                        if (reader.Read())
                        {
                            concesionaria = factory.Crear(reader);
                            concesionaria.DatosDeEmpresa = _comun.LeerInformacionDeEmpresa(concesionaria.DatosDeEmpresa.Id);
                        }
                }
            }
            catch (Exception ex)
            {
                throw new ExcepcionDatos("Error desconocido", ex);
            }

            return concesionaria;
        }
    }
}